기본 구성
하드웨어는 기본적으로 필수 장치와 주변 장치로 나뉜다. CPU와 메인 메모리가 필수 장치이고, 입출력 장치나 저장 장치 등이 주변 장치로 분류된다.
메인 메모리는 제 1 저장 장치라고도 불리며, 전력이 끊어지면 데이터를 잃어버린다. 따라서 영구적으로 데이터를 보관하기 위해선 별도의 작업이 필요하다. 이 역할을 해주는 것이 USB, 하드디스크 같은 저장 장치이고, 제 2 저장 장치라고도 불린다.
왜 저장 장치는 메모리보다 느릴까?
- 설계 목적 차이: 메인 메모리는 데이터를 빠르게 읽고 쓰기 위해 설계되었으며, CPU와 가까운 위치에서 데이터를 직접 주고받는다. 반면, 저장 장치는 데이터를 안정적으로 장기간 보존하는 데 중점을 둔다.
- 비용과 기술적 제약: 메모리는 고속 처리를 위해 고급 반도체 기술을 사용하지만, 저장 장치는 비용 효율성을 중시하여 대량의 데이터를 저장할 수 있도록 설계된다.
- 데이터 접근 방식 차이: 메모리는 랜덤 액세스 방식으로 동작하여 모든 위치에 균일한 시간으로 접근 가능하지만, 저장 장치는 블록 단위 접근으로 인해 속도가 느릴 수 있다.
폰노이만 구조
폰노이만 구조는 CPU, 메모리, 입출력장치, 저장장치가 버스로 연결된 시스템 설계 모델을 말한다. 이 구조는 오늘날 대부분의 컴퓨터 시스템에 적용된 기본 아키텍처다.
이전 컴퓨터는 하드와이어링 형태였기 때문에 다른 용도로 컴퓨터를 사용하려면 전선의 연결을 바꿔야했다. 폰노이만 구조 덕분에 하드웨어를 바꾸지 않고도 프로그램을 교체할 수 있게 된 것이고, 컴퓨터로 다양한 작업을 할 수 있게 된 것이다.
폰노이만 구조의 가장 중요한 특징은 모든 프로그램은 메모리에 올라와야 실행할 수 있다. 는 것이다.
시스템 버스와 CPU 버스
시스템 버스는 메모리와 주변장치를 연결하며, FSB(Front-Side Bus) 혹은 전면 버스라고 부른다. CPU 버스는 CPU 내부 다양한 장치들을 연결하는 버스로 BSB(Back-Side Bus) 혹은 후면 버스라고 부른다. BSB의 속도는 CPU의 클록과 같으며 FSB보다 훨씬 빠르다.
클록
컴퓨터에서 일정한 박자를 만들어내는 것을 클록이라고 한다. 클록에 의해 일정 간격으로 만들어진느 틱을 펄스 혹은 클록 틱이라고 부른다. 클록이 펄스를 만들면 거기에 맞춰 컴퓨터 안 부품들이 작업을 진행한다.
이 펄스의 단위는 Hz다. 1초 동안 몇 번의 작업이 이루어져 몇 번의 펄스가 발생했는지 의미한다. 예를 들어 3GHz의 CPU가 있다면 해당 CPU는 1초 동안 약 30억 번의 작업이 가능한 CPU인 것이다.
cpu와 메모리
CPU 구성
- 산술논리 연산장치(ALU): CPU에서 데이터를 연산하는 장치
- 제어장치: CPU에서 작업을 지시하는 부분
- 레지스터: 작업에 필요한 데이터를 CPU 내부에 보관하는 곳
레지스터 종류
레지스터는 크게 일반 레지스터와 특수 레지스터로 구분된다. 일반 레지스터는 사용자 프로그램에 의해 변경되지만, 특수 레지스터는 사용자가 임의로 변경할 수 없다.
일반 레지스터
- 데이터 레지스터(DR): 메모리에서 가져온 데이터를 임시로 저장한다.
- 주소 레지스터(AR): 데이터 또는 명령어가 저장된 메모리의 주소를 저장한다.
특수 레지스터
- 프로그램 카운터(PC): 다음에 실행할 명령어의 주소를 기억하고 있다가 제어장치에 알려준다.
- 명령어 레지스터(IR): 현재 실행 중인 명령어를 저장한다.
- 메모리 주소 레지스터(MAR): 메모리에서 데이터를 가져오거나 반대로 메모리로 데이터를 보낼 때 주소를 지정하는 데 사용된다.
- 메모리 버퍼 레지스터(MBR): 메모리에서 가져온 데이터나 메모리로 옮겨갈 데이터를 임시로 저장한다. 항상 메모리 주소 레지스터와 함께 동작한다.
AR & MAR 둘 다 메모리 주소를 다루지만, AR은 CPU 내부 작업을 위한 주소 저장에 사용되며, MAR은 메모리 접근을 위한 주소를 관리한다.
DR & MBR 둘 다 데이터를 임시 저장하지만, DR은 CPU 연산 중 데이터를 저장하며, MBR은 메모리와 CPU 간 데이터 전송을 위한 버퍼 역할을 한다.
그림을 통해 Load mem(100), register 2가 처리되는 과정을 살펴보자.
- PC에는 실행할 코드의 행 번호가 저장된다. 이 코드는 제어장치(Control Unit)에서 실행된다. 실행된 코드는 IR에 저장된다.
- 제어장치가 IR에 있는 명령어를 해석해 메모리 100에 있는 데이터를 가져오라는 신호를 보낸다.
- MAR에는 100이 저장된다. 메모리에 있는 데이터를 CPU로 옮기는 일은 메모리 컨트롤러가 담당한다. 레지스터는 CPU가 관리하는 영역이기 때문에 메모리 컨트롤러는 숫자 2를 레지스터로 직접 옮기지 못한다. 따라서 MBR로 보낸다.
- 제어장치는 메모리 버퍼 레지스터에 저장된 값 2를 레지스터 2로 옮긴다.
버스의 종류
시스템 버스는 제어 버스, 주소 버스, 데이터 버스로 나뉜다.
-
제어 버스: 제어 버스에는 다음에 어떤 작업을 할지 지시하는 제어 신호가 오고 간다.
- CPU, 메모리, 주변장치와 양방향으로 오고 간다.
-
주소 버스: 메모리의 데이터를 읽거나 쓸 때 어느 위치에서 작업할 것인지를 알려주는 주소 정보가 오고 간다. 이 버스는 메모리 주소 레지스터와 연결되어 있으며 단방향이다.
- CPU에서 메모리나 주변장치로 나간다. 반면 주소 버스를 통해 CPU로 전달되는 정보는 없다.
- 데이터 버스: 데이터가 목적지까지 이동할 수 있도록 한다. 이 버스는 메모리 버퍼 레지스터와 연결되어 있으며 양방향이다.
버스의 대역폭은 한 번에 전달할 수 있는 데이터의 최대 크기다. 이 버스의 대역폭은 CPU가 한 번에 처리할 수 있는 데이터의 크기와 같다. 흔히 32bit CPU, 64bit CPU라고 하는데 여기서 32bit, 64bit가 CPU가 한 번에 처리할 수 있는 데이터의 크기이며, 이는 버스의 대역폭, 레지스터의 크기와 같다.
메모리
종류
메모리는 읽거나 쓸 수 있는 RAM(Random Access Memory)과 읽기만 가능한 ROM(Read Only Memory)으로 구분된다. RAM
-
휘발성
- DRAM: 데이터가 일정 시간이 지나면 사라진다.
- SRAM: 전력이 공급되는 동안 데이터를 저장할 수 있다.
- SDRAM: 펄스가 발생할 때마다 데이터를 저장한다.
-
비휘발성
- FRAM
- PRAM ROM
- PROM
- EPROM 전력이 끊겨도 데이터를 보관할 수 있다. 하지만 읽기 전용이기 때문에 BIOS(Basic Input/Output System)를 ROM에 저장한다.
보호
운영체제 영역이나 다른 프로그램 영역으로 침범하려는 바이러스로부터 메모리를 보호하기 위해선 하드웨어의 도움이 필요하다.
CPU는 현재 진행 중인 작업의 메모리 시작 주소를 경계 레지스터에 저장하고, 마지막 주소를 한계 레지스터에 저장한다. 작업이 진행되는 과정에서 두 주소 범위를 벗어나는지 점검해 보호한다.
만약 주소 범위를 벗어난다면, 인터럽트가 발생한다. 이땐 운영체제가 해당 프로그램을 강제 종료시키게 된다.
부팅
결국 운영체제도 CPU에 의해 실행되는 프로그램이다. 따라서 운영체제를 메모리에 올리는 과정이 있어야 하고 이 과정을 부팅이라고 한다.
사용자가 컴퓨터의 전원을 키면 ROM에 저장된 BIOS가 실행된다. BIOS는 하드웨어를 점검하고, 운영체제를 실행시키는 부트스트랩 코드를 실행시킨다.
컴퓨터 성능 향상 기술
현대 컴퓨터 구조의 가장 큰 문제는 CPU와 메모리, 주변장치의 작업 속도가 다르다는 것이다. CPU는 내부 버스의 속도와 같다. 하지만 시스템 버스의 속도보다 빠르기 때문에 주변 장치의 속도가 따라가지 못한다.
이를 해결하기 위해선 어떤 방법이 있을까?
버퍼
버퍼는 두 장치 사이의 속도 차이를 완화하는 역할을 한다. 일정량의 데이터를 모아 한꺼번에 전송하면 적은 작업량으로도 많은 양의 데이터를 옮길 수 있다.
스풀
버퍼와 유사한 용어로 스풀이 있다. 스풀은 CPU와 입출력장치가 독립적으로 동작하도록 고안된 소프트웨어적 버퍼이다.
예를 들어 워드프로세서로 작업하고 프린터로 출력한다고 했을 때 스풀러가 없다면, 출력까지 워드프로세서가 알아서 처리해야 하므로 인쇄가 끝날 때까지 워드프로세서를 사용할 수 없게 되는 것이다. -> 인쇄 내용을 스풀러 공간에 저장하면 인쇄 동안에도 워드프로세서로 다른 작업을 할 수 있게 된다.
캐시
캐시는 메모리와 CPU 간의 속도 차이를 완화하기 위해 메모리의 데이터를 미리 가져와 저장해 두는 임시 저장소라고 할 수 있다. 메모리는 시스템 버스의 속도로 작동하기 때문에 비교적 느리지만, 캐시는 CPU 내부 버스의 속도로 작동하기 때문에 빠르다.
CPU는 메모리에 접근할 때 먼저 캐시를 방문한다. 원하는 데이터를 찾았을 때 캐시 히트라고 하며 그 데이터를 바로 사용한다. 하지만 원하는 데이터가 캐시에 없다면, 메모리로 가서 그 데이터를 찾아야 한다. 이를 캐시 미스라고 한다.
컴퓨터의 성능을 향상하려면 캐시 적중률이 높아야 한다.
- 캐시의 크기를 늘린다.
-
지역성 이론에 따라 데이터를 가져온다.
- 가까이 있는 데이터가 사용될 확률이 더 높다는 이론
만약 캐시에 있는 데이터가 변경되면, 이 변경 사항을 메모리에 반영해야 한다. 이때 두가지 방식이 있다.
-
즉시 쓰기: 캐시의 변경 사항을 메모리에 즉시 반영한다.
- 장점: 메모리와 캐시 사이 데이터 불일치가 발생하지 않음
- 단점: 빈번한 데이터 전송으로 성능이 느려짐
-
지연 쓰기: 캐시의 변경 사항을 모아서 주기적으로 반영한다.
- 장점: 데이터 전송 횟수가 줄어 시스템 성능 향상
- 단점: 메모리와 캐시 사이 데이터 불일치가 발생할 수 있음
저장장치의 계층 구조
저장장치의 계층 구조는 사용자가 저렴한 가격으로 용량은 하드디스크처럼 사용하고 작업 속도는 레지스터처럼 빠르게 만들어준다. 하지만 중복되는 데이터의 일관성을 유지하는 것이 문제가 될 수 있다.
인터럽트
초기 컴퓨터는 주변장치가 많지 않았다. 따라서 CPU가 입출력장치에서 데이터를 가져오거나 보냈는데, 이렇게 CPU가 주변장치의 상태를 주기적으로 확인하며 처리하는 방식을 폴링(Polling) 방식이라고 한다.
오늘날 주변장치가 많아지면서 CPU가 모든 입출력에 관여하면 작업 효율이 떨어진다. 이러한 문제를 해결하기 위해 등장한 것이 인터럽트 방식이다.
인터럽트 방식은 CPU의 작업과 저장장치의 데이터 이동을 독립적으로 운영함으로써 시스템의 효율을 높인다. 즉 데이터의 입출력이 이루어지는 동안 CPU가 다른 작업을 할 수 있다.
인터럽트 방식의 동작 과정을 살펴보자.
- CPU가 IO 컨트롤러에게 입출력 명령을 보낸다.
- IO 컨트롤러는 명령받은 데이터를 메모리에 가져다 놓거나 메모리에 있는 데이터를 저장장치로 옮긴다.
- 데이터 전송이 완료되면 IO 컨트롤러는 CPU에게 완료 신호를 보낸다.
- CPU는 현재 작업을 중단하고, 데이터를 처리한다. 여기서 CPU에 전달되는 완료 신호를 인터럽트라고 한다. 인터럽트가 전달되면, CPU는 하던 일을 중단하고 옮겨진 데이터를 처리한다. 이처럼 하던 작업을 중단하고 처리해야 하는 신호라는 의미에서 인터럽트라는 이름이 붙은 것이다.
DMA(Direct Memory Access)
인터럽트 방식으로 작업을 수행하기 위해선 IO 컨트롤러가 CPU의 허락 없이 메모리에 접근할 수 있는 권한이 필요하다. 이것을 직접 메모리 접근(DMA)라고 한다.
MMIO(Memory Mapped I/O)
DMA 방식은 인터럽트 방식의 시스템을 구성하는 필수 요소다. 하지만 IO 컨트롤러가 메모리를 직접 사용하게 되면 메모리가 복잡해진다. 따라서 CPU가 사용하는 메모리 공간과 DMA를 통해 들어오고 나가는 데이터를 분리하는 것이 필요하다. 이렇게 메모리의 일정 공간을 입출력에 할당하는 기법을 MMIO라고 한다.
사이클 훔치기
만약 CPU와 DMA가 동시에 메모리에 접근할 한다면 어떤 일이 발생할까? 이 경우엔 보통 CPU가 메모리 사용 권한을 양보한다. 그 이유는 CPU의 작업 속도가 더 빠르기 때문이다. 이렇게 DMA가 메모리에 접근하는 동안 CPU가 메모리를 사용하지 못하도록 잠시 대기하는 상황을 사이클 훔치기(Cycle Stealing)라고 한다.
멀티 프로세싱
단일 프로세서 시스템
과거에는 컴퓨터 한 대에 프로세서(CPU)가 하나 있는 시스템이었다. 이를 단일 프로세서 시스템이라고 한다. 이런 시스템에서 성능을 향상하는 방법은 CPU의 클록을 높이거나 캐시의 크기를 늘리는 것이었다. 하지만 클록을 높이면 발열 문제가 생기고, 캐시의 크기를 늘리는 것은 비용적인 한계가 있다.
멀티 프로세서 시스템
컴퓨터 성능을 높이기 위해 프로세서를 여러 개 설치하여 사용하는 시스템을 멀티 프로세서 시스템이라고 한다. 멀티 프로세서 시스템에선 프로세서마다 레지스터와 캐시를 가지며, 모든 프로세서가 시스템 버스를 통해 메인 메모리를 공유한다.
멀티코어 시스템
단일 프로세서 시스템을 멀티 프로세서 시스템으로 바꾸기 위해선 메인 보드의 설계 변경을 포함해 많은 변화가 필요하다. 그런데 기존 시스템을 유지한 채 멀티 프로세싱을 할 수 있게 하는 시스템이 있다. 바로 멀티코어 시스템이다.
멀티코어 시스템은 하나의 칩에 CPU의 핵심이 되는 코어를 여러 개 만들어 여러 작업을 동시에 처리할 수 있게 한다.
CPU 멀티스레드
하나의 코어에서 2개 이상의 명령어를 처리하는 방법도 있다. 하나의 코어가 여러 개의 스레드를 이용하게 하는 것이다. 여기서 스레드란 CPU가 처리할 수 있는 작업의 단위를 말한다. 이렇게 여러 스레드를 동시에 처리하는 방법을 CPU 멀티스레드라고 한다.
프로세서 vs 코어
| 구분 | 프로세서(Processor) | 코어(Core) |
|---|---|---|
| 개념 | 작업을 처리하는 CPU 전체 장치. | 프로세서 내부에서 작업을 처리하는 독립적인 명령어 처리 단위. |
| 구성 | 코어, 캐시, 메모리 컨트롤러, 버스 인터페이스 등으로 구성. | 명령어 처리 유닛(CU, ALU)로 구성. |
| 주요 역할 | 컴퓨터의 전체 작업 관리 및 처리. | 병렬 처리 및 작업 분산. |
| 병렬 처리 능력 | 코어 수에 따라 병렬 처리 능력이 결정. | 각 코어가 독립적으로 병렬 작업 수행. |
| 예시 | Intel Core i7 프로세서(다중 코어 포함). | 6코어, 8코어 등 단일 프로세서 내 여러 코어. |
각 시스템 비교
| 개념 | CPU/코어 수 | 예시 상황 |
|---|---|---|
| 단일 프로세서 시스템 | CPU 1개 | 한 사람이 계산기를 하나 사용하여 계산 |
| 멀티 프로세서 시스템 | CPU 여러 개 | 두 사람이 각각 계산기를 사용해 계산 |
| 멀티 코어 시스템 | 코어 여러 개 | 한 사람이 손에 여러 계산기를 들고 계산 |
| 멀티 스레드 | 스레드 여러 개 | 한 계산기에서 덧셈과 곱셈을 동시에 처리 |